home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / AMOS3.DMS / AMOS3.adf / Extensions / Request.s < prev   
Text File  |  1978-10-10  |  9KB  |  384 lines

  1.  
  2.     Include    "Equ.s"
  3.     Include "Pointe.s"
  4.     
  5. ******************************************************************
  6. *     **  *    * **** ****    ***    **  **** ***  ***
  7. *     *  * **  ** *  * *       *  *  *  * *     *  *
  8. *     **** * ** * *  * ****    ****  **** ****  *  *
  9. *     *  * *    * *  *    *    *   * *  *    *  *  *  
  10. *     *  * *    * **** ****    ****  *  * **** ***  ***
  11. ******************************************************************
  12. *    AMOS REQUESTER HANDLER
  13. *    
  14. *    By Francois Lionet
  15. *    
  16. *    AMOS Basic (c) 1990 Mandarin / Jawx
  17. ******************************************************************
  18. *    This source code is public domain. You can freely copy,
  19. * modify, distribute it. Experiment with it, and have fun!
  20. ******************************************************************
  21.  
  22. *-----------------------------------------------------------------
  23. *    Note to all machine language programmers!
  24. *    I have been doing this requester keeping it SIMPLE, and
  25. *    SMALL. It is just 1186 bytes long. Of course, you can
  26. *    make a new one. I would love to see your new wicked
  27. *    requesters. Think about public domain: having your name
  28. *    displayed each time an error occurs (specially bad ones)!!!
  29. *    
  30. *    It is late, I am very tired, the requester is finished
  31. *    now, I'll go to bed! AMOS to be on sale in 5 days!
  32. *
  33. *                Have fun! Francois Lionet
  34. *
  35. *    PS: when you make an extension, make the code relative (pc),
  36. *    thinking to the compiler.
  37. *    PPS: do not forget to call UnMix1 and UnMix2 routines before
  38. *    doing anything: if the requester does not come from AMOS,
  39. *    AMOS will continue to use screens, and interfer with the
  40. *    requester...
  41. *    PPPS: for more info on AMOS extension interface, refer to 
  42. *    the music extension...
  43. *-----------------------------------------------------------------
  44. *    2 new instructions, not documented (sorry!)
  45. *        - REQUEST OFF --> no requester, as if you were 
  46. *          always clicking CANCEL (really nice this one!)
  47. *        - REQUEST ON  --> this magnificent requester
  48. *-----------------------------------------------------------------
  49.  
  50.  
  51. ******************************************************************
  52. *    AMOS INTERFACE
  53.  
  54. *******    COLD START
  55.     lea    ReqData(pc),a4
  56.     move.l    a0,Branch-ReqData(a4)    * Address of BRANCH TABLE
  57.     move.l    a5,Datas-ReqData(a4)
  58.  
  59.     lea    DefEPa+8(a5),a0        * Default palette + req palette
  60.     lea    ReqPal+8(pc),a1
  61.     moveq    #28-1,d0
  62. CPal    move.w    (a0)+,(a1)+
  63.     dbra    d0,CPal
  64.     lea    ReqFlag(pc),a0        * Default is ON!
  65.     move.w    #-1,(a0)
  66.     
  67.     moveq    #0,d2            * No check bank
  68.     lea    Tk(pc),a0        * Address of TOKEN TABLE
  69.     lea    ReqWel(pc),a1        * Address of WELCOME MESSAGE
  70.     lea    ReqDef(pc),a2        * Address of SCREEN RESET
  71.     lea    ReqEnd(pc),a3        * Address of QUIT
  72.     moveq    #2,d1            * Returns NUMBER OF EXTENSION
  73.     moveq    #0,d0            * NO ERRORS
  74.     rts
  75.  
  76. ******* SCREEN RESET
  77. ReqDef:    rts
  78.  
  79. ******* QUIT
  80. ReqEnd:    rts
  81.  
  82. ******* REQUEST ON
  83. ReqOn    moveq    #-1,d0
  84.     bra.s    ROnOf
  85. ******* REQUEST OFF
  86. ReqOf    moveq    #0,d0
  87. ROnOf    lea    ReqFlag(pc),a0
  88.     move.w    d0,(a0)
  89.     rts
  90.  
  91. ***********************************************************
  92. *    AMOS REQUESTER
  93. Request    move.w    ReqFlag(pc),d0
  94.     beq    AlwNo
  95.     movem.l    a0-a6/d1-d7,-(sp)
  96.  
  97. ******* Screen setup (boring!!!)
  98.     SyCall    AMALFrz
  99.     lea    ReqData(pc),a6
  100.     move.l    Datas-ReqData(a6),a5
  101.     bsr    UnMix1
  102.  
  103.     move.w    #288,d0
  104.     move.w    d2,d1
  105.     lsr.w    #2,d1
  106.     sub.w    d1,d0
  107.     move.w    d0,ReqWX-ReqData(a6)    
  108.     move.l    d2,d0
  109.     lsr.w    #3,d0
  110.     move.w    d0,ReqSX-ReqData(a6)
  111.     add.w    #16,d3            * 2 lines in Y!!!
  112.     move.w    d3,d0
  113.     lsr.w    #1,d0
  114.     move.w    d0,ReqSY-ReqData(a6)
  115.     move.l    a1,ReqMain-ReqData(a6)
  116.     move.l    a2,ReqPos-ReqData(a6)
  117.     move.l    a3,ReqNeg-ReqData(a6)
  118. * Open screen
  119.     moveq    #2,d4
  120.     move.l    #$8000,d5
  121.     moveq    #4,d6
  122.     moveq    #0,d7
  123.     lea    ReqPal-ReqData(a6),a1
  124.     EcCalD    Cree,EcReq
  125.     bne    NoReq
  126.     move.l    a0,ScAdr-ReqData(a6)
  127.     SyCalD    ResZone,2
  128. * Initialise background text
  129.     WiCalA    Print,ReqBack-ReqData(a6)
  130.     WiCalA    Centre,ReqTit-ReqData(a6)
  131. * Print main text
  132.     moveq    #0,d1
  133.     moveq    #4,d2
  134.     WiCall    Locate
  135.     move.l    ReqMain-ReqData(a6),a4
  136. MnText    move.l    12(a4),a1
  137.     WiCall    Centre
  138.     WiCalD    ChrOut,10
  139.     move.l    16(a4),d0
  140.     move.l    d0,a4
  141.     bne.s    MnText
  142. * Positive text (left)
  143.     move.l    ReqPos-ReqData(a6),d0
  144.     beq.s    NoPos
  145.     move.l    d0,a0
  146.     move.l    12(a0),d0
  147.     beq.s    NoPos
  148.     move.l    d0,ReqPos-ReqData(a6)
  149.     moveq    #1,d0
  150.     moveq    #"0",d1
  151.     bsr    PrtZone
  152. * Negative text (right)
  153. NoPos    move.l    ReqNeg-ReqData(a6),d0
  154.     beq.s    NoNeg
  155.     move.l    d0,a0
  156.     move.l    12(a0),d0
  157.     beq.s    NoPos
  158.     move.l    d0,ReqNeg-ReqData(a6)
  159.     move.l    d0,a0
  160. CptNeg    tst.b    (a0)+
  161.     bne.s    CptNeg
  162.     sub.l    d0,a0
  163.     move.w    ReqSx-ReqData(a6),d0
  164.     sub.w    a0,d0
  165.     add.b    #48,d0
  166.     move.b    d0,XTNeg-ReqData(a6)
  167.     moveq    #2,d0
  168.     moveq    #"0",d1
  169.     bsr    PrtZone
  170. * Screen appearance
  171. NoNeg    move.l    ScAdr-ReqData(a6),a2
  172.     move.w    ReqWX-ReqData(a6),EcAWX(a2)
  173.     bset    #1,EcAW(a2)
  174.     moveq    #8,d7
  175.     moveq    #1,d6
  176.     moveq    #ReqWY,d5
  177.     add.w    ReqSY-ReqData(a6),d5
  178.     bsr    AppCentre
  179.     bsr    UnMix2
  180.  
  181. ******* Test loop (fun!)
  182. ReqLoop    SyCall    WaitVbl
  183. * Keyboard
  184.     SyCall    Inkey
  185.     cmp.w    #13,d1        * ASCII-> Return 
  186.     beq.s    ReqYes    
  187.     cmp.w    #27,d1        * ASCII-> ESC
  188.     beq.s    ReqNo        
  189. * Don't you think it is better than this wierd Amiga V and B?
  190. * Sometime I ask myself what they were thinking when they chose such
  191. * key combinations!
  192.     swap    d1
  193.     move.w    d1,d0        * Isolate AMIGA keys
  194.     and.w    #%1100000000000000,d0
  195.     beq.s    RqL0
  196.     cmp.b    #$34,d1        * V
  197.     beq.s    ReqYes
  198.     cmp.b    #$35,d1        * B
  199.     beq.s    ReqNo
  200. * Mouse pointer
  201. RqL0    SyCall    GetZone
  202.     cmp.w    #EcReq,d1
  203.     beq.s    RqL1
  204.     moveq    #0,d1
  205. RqL1:    swap     d1
  206.     cmp.w    d7,d1
  207.     beq.s    RqL2
  208.     move.w    d7,d0
  209.     move.w    d1,d7
  210.     moveq    #"0",d1
  211.     bsr    UnMix1
  212.     bsr    PrtZone
  213.     bsr    UnMix2
  214. RqL2:    move.w    d7,d0
  215.     moveq    #"1",d1
  216.     bsr    UnMix1
  217.     bsr    PrtZone
  218.     bsr    UnMix2
  219.     tst.w    d7
  220.     beq.s    ReqLoop
  221.     SyCall    MouseKey
  222.     tst.w    d1
  223.     beq    ReqLoop
  224.     cmp.w    #2,d7
  225.     beq.s    ReqNo
  226. ReqYes    moveq    #-1,d0
  227.     bra.s    ReqGo
  228. ReqNo    moveq    #0,d0
  229.  
  230. ******* End of screen (well done!!!)
  231. ReqGo    move.l    d0,-(sp)
  232.     bsr    UnMix1
  233.     move.l    ScAdr-ReqData(a6),a2
  234.     moveq    #-8,d7
  235.     move.w    EcTY(a2),d6
  236.     lsr.w    #1,d6
  237.     moveq    #ReqWY,d5
  238.     add.w    ReqSY-ReqData(a6),d5
  239.     bsr    AppCentre
  240.     EcCalD    Del,EcReq
  241.     bsr    UnMix2
  242.  
  243. ******* Back to system!
  244. ReqX    SyCall    AMALUFrz    
  245.     move.l    (sp)+,d0        * Returns answer
  246.     movem.l    (sp)+,a0-a6/d1-d7
  247.     rts
  248. ******* Can't open screen!!!
  249. NoReq    clr.l    -(sp)
  250.     bra.s    ReqX
  251. ******* Always no!!!
  252. AlwNo    moveq    #0,d0
  253.     rts
  254.  
  255. ******* Print a zone D0-> zone, D1-> inverse or not
  256. PrtZone    subq.w    #1,d0
  257.     bmi.s    PrtX
  258.     bne.s    PrtNeg
  259. * Print pos text
  260. PrtPos    lea    TPos1-ReqData(a6),a1
  261.     move.b    d1,5(a1)
  262.     WiCall    Print
  263.     move.l    ReqPos-ReqData(a6),a1
  264.     WiCall    Print
  265.     WiCalA    Print,TPos2-ReqData(a6)
  266.     bra.s    PrtX
  267. * Print neg text
  268. PrtNeg    lea    TNeg1-ReqData(a6),a1
  269.     move.b    d1,5(a1)
  270.     WiCall    Print
  271.     move.l    ReqNeg-ReqData(a6),a1
  272.     WiCall    Print
  273.     WiCalA    Print,TNeg2-ReqData(a6)
  274. PrtX    rts
  275.  
  276. ******* Screen appearance
  277. AppCentre:
  278.     move.w    d6,d4
  279.     move.w    d6,EcAWTy(a2)
  280.     add.w    d6,EcAWTy(a2)
  281.     bset    #2,EcAWT(a2)
  282.     move.w    EcTy(a2),d0
  283.     lsr.w    #1,d0
  284.     sub.w    d6,d0
  285.     move.w    d0,EcAVY(a2)
  286.     bset    #2,EcAV(a2)
  287.     move.w    d5,EcAWy(a2)
  288.     sub.w    d6,EcAWy(a2)
  289.     bset    #2,EcAW(a2)
  290.     movem.l    a2/d4-d7,-(sp)
  291.     SyCall    WaitVBL
  292.     EcCall    CopForce
  293.     movem.l    (sp)+,a2/d4-d7
  294.     add.w    d7,d6
  295.     bpl.s    FsApp2
  296.     clr.w    d6
  297. FsApp2:    move.w    EcTy(a2),d0
  298.     lsr.w    #1,d0
  299.     cmp.w    d0,d6
  300.     bcs.s    FsApp3
  301.     move.w    d0,d6
  302. FsApp3:    cmp.w    d4,d6
  303.     bne.s    AppCentre
  304.     rts
  305.  
  306. ******* Prevent mixes between AMOS and the requester!
  307. UnMix1    movem.l    d0-d7/a0-a6,-(sp)
  308.     move.l    $4,a6
  309.     jsr    Forbid(a6)
  310.     EcCall    Current
  311.     move.w    EcNumber(a0),d1
  312.     lea    ReqOld(pc),a0
  313.     move.w    d1,(a0)
  314.     EcCalD    Active,EcReq
  315.     EcCalD    First,EcReq
  316.     movem.l    (sp)+,d0-d7/a0-a6
  317.     rts
  318. UnMix2    movem.l    d0-d7/a0-a6,-(sp)
  319.     move.w    ReqOld(pc),d1
  320.     EcCall    Active
  321.     move.l    $4,a6
  322.     jsr    Permit(a6)
  323.     movem.l    (sp)+,d0-d7/a0-a6
  324.     rts
  325.  
  326. ***********************************************************
  327. *     TOKEN TABLE + Addresses
  328.  
  329. * On loading, AMOS changes the AUTOREQUEST vector using the
  330. * following address, so it's got to be there!
  331.     dc.l     Request    
  332.  
  333. Tk:    dc.w     1,0
  334.     dc.b     $80,-1
  335.     dc.w    ReqOn-Tk,1
  336.     dc.b    "Request o","n"+$80,"I",-1
  337.     dc.w    ReqOf-Tk,1
  338.     dc.b    "Request of","f"+$80,"I",-1
  339.     dc.w     0
  340.  
  341. ***********************************************************
  342. *    DATA ZONE
  343. ReqData    dc.l     0
  344. Branch    dc.l     0
  345. ScAdr    dc.l     0
  346. Datas    dc.l     0
  347. ReqMain    dc.l     0
  348. ReqPos    dc.l     0
  349. ReqNeg    dc.l     0
  350. ReqWX    dc.w     0
  351. ReqWY    equ     103
  352. ReqSx    dc.w     0
  353. ReqSY    dc.w    0
  354. ReqFlag    dc.w     0
  355. ReqOld    dc.w     0
  356.  
  357. ReqPal    dc.w    $000,$46C,$FFF,$C41
  358.     ds.w    28
  359.  
  360. * Background drawing
  361. ReqBack    dc.b 27,"C0",27,"V0"
  362.     dc.b 24,28,31,27,"E0",24,29,30,27,"E2"
  363.     dc.b 27,"B3",24,31,7
  364.     dc.b 24,28,31,27,"E0",29,29,31,27,"E2"
  365.     dc.b 24,31
  366.     dc.b 0
  367. * Title
  368. ReqTit    dc.b "System request",27,"B1",0
  369. * Positive text
  370. TPos1    dc.b 27,"B3",27,"I0",24,30,30,28,27,"E0",27,"Z0",0
  371. TPos2    dc.b 27,"E2",27,"Z1",0
  372. * Negative text
  373. TNeg1    dc.b 27,"B3",27,"I0",24,30,30,27,"X"
  374. XTNeg    dc.b "0",27,"E0",27,"Z0",0
  375. TNeg2    dc.b 27,"E2",27,"Z2",0
  376.  
  377. *************** Welcome message
  378. ReqWel:    dc.b     27,"Y",48+10,"Requester V 1.1",0
  379.     
  380. ***************
  381.     dc.l    0
  382.  
  383.  
  384.